package DA;

import java.awt.Component;
import java.awt.Event;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Utils {

    //<editor-fold defaultstate="collapsed" desc="Variables públicas del sistema">
    public static String rutaAplicacion = "";
    public static String usuarioID = "";
    public static boolean Debug = false;
    //</editor-fold>
    public static TableModel ModeloTablaViaticos;

    public static TableModel getModeloTablaViaticos() {
        return ModeloTablaViaticos;
    }

    public static void setModeloTablaViaticos(TableModel ModeloTabla) {
        Utils.ModeloTablaViaticos = ModeloTabla;
    }

    
    
    public static String Fecha2(FormatoFecha formato) {
        try {
            Calendar fecha = new GregorianCalendar();
            int año = fecha.get(Calendar.YEAR);
            int mes = 1 + fecha.get(Calendar.MONTH);
            int dia = fecha.get(Calendar.DAY_OF_MONTH);
            switch (formato) {
                case ddmmyy:
                    return (CompletaCeros(dia) + "-" + CompletaCeros(mes) + "-" + String.valueOf(año));
                case mmddyy:
                    return (CompletaCeros(mes) + "-" + CompletaCeros(dia) + "-" + String.valueOf(año));
                case ddmmyyhh:
                    return (CompletaCeros(dia) + "-" + CompletaCeros(mes) + "-" + String.valueOf(año) + " " + Hora());
                case mmddyyhh:
                    return (CompletaCeros(mes) + "-" + CompletaCeros(dia) + "-" + String.valueOf(año) + " " + Hora());
                case secuencia:
                    return (String.valueOf(año) + CompletaCeros(mes) + CompletaCeros(dia));
                case yymmdd:
                    return (CompletaCeros(año) + "-" + CompletaCeros(mes) + "-" + String.valueOf(dia));
            }
            return "00-00-00";
        } catch (Exception ex) {
            Bitacora("Utils", "Fecha()", ex, NivelBitacora.Error);
            return null;
        }
    }

    //<editor-fold defaultstate="collapsed" desc="Método para devolver la Fecha del sistema">
    public static String Fecha(FormatoFecha formato) {
        try {
            Calendar fecha = new GregorianCalendar();
            int año = fecha.get(Calendar.YEAR);
            int mes = 1 + fecha.get(Calendar.MONTH);
            int dia = fecha.get(Calendar.DAY_OF_MONTH);
            switch (formato) {
                case ddmmyy:
                    return (CompletaCeros(dia) + "/" + CompletaCeros(mes) + "/" + String.valueOf(año));
                case mmddyy:
                    return (CompletaCeros(mes) + "/" + CompletaCeros(dia) + "/" + String.valueOf(año));
                case ddmmyyhh:
                    return (CompletaCeros(dia) + "/" + CompletaCeros(mes) + "/" + String.valueOf(año) + " " + Hora());
                case mmddyyhh:
                    return (CompletaCeros(mes) + "/" + CompletaCeros(dia) + "/" + String.valueOf(año) + " " + Hora());
                case secuencia:
                    return (String.valueOf(año) + CompletaCeros(mes) + CompletaCeros(dia));
            }
            return "00/00/00";
        } catch (Exception ex) {
            Bitacora("Utils", "Fecha()", ex, NivelBitacora.Error);
            return null;
        }
    }
    //</editor-fold>    

    //<editor-fold defaultstate="collapsed" desc="Método para devolver la Hora del sistema">
    public static String Hora() {
        try {
            Calendar Hora = new GregorianCalendar();
            int hora = Hora.get(Calendar.HOUR_OF_DAY);
            int minuto = Hora.get(Calendar.MINUTE);
            int segundo = Hora.get(Calendar.SECOND);
            return (CompletaCeros(hora) + ":" + CompletaCeros(minuto) + ":" + CompletaCeros(segundo));
        } catch (Exception ex) {
            Bitacora("Utils", "Hora()", ex, NivelBitacora.Error);
            return "00:00:00";
        }
    }
    //</editor-fold> 

    //<editor-fold defaultstate="collapsed" desc="Método para completar los ceros de dos en números de una cifras">
    public static String CompletaCeros(int cifra) {
        try {
            String str = String.valueOf(cifra);
            if (str.length() == 1) {
                return ("0" + str);
            }
            return str;
        } catch (Exception ex) {
            Bitacora("Utils", "CompletaCeros()", ex, NivelBitacora.Error);
            return "00";
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para remover la combinación de ctrl + v de un JTextField">
    public static void RemoverCtrlV(JTextField txt) {
        try {
            InputMap map2 = txt.getInputMap(JTextField.WHEN_FOCUSED);
            map2.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK), "null");
        } catch (Exception ex) {
            Bitacora("Utils", "RemoverCtrlV()", ex, NivelBitacora.Error);
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para obtener imágenes">
    public Image ObtenerImagen(String NombreImagen, int AnchoAEscalar, int AltoAEscalar) {
        try {
            Image imagen;
            imagen = new ImageIcon(getClass().getResource(NombreImagen)).getImage().getScaledInstance(AnchoAEscalar, AltoAEscalar, Image.SCALE_SMOOTH);
            return imagen;
        } catch (Exception ex) {
            Bitacora("Utils", "ObtenerImagen()", ex, NivelBitacora.Error);
            return null;
        }
    }
    //</editor-fold> 

    //<editor-fold defaultstate="collapsed" desc="Método para el ajuste de las imagenes.">
    public void AjusteImagenes(JPanel panel) {
        try {
            Component[] componentes = panel.getComponents();
            for (Component componente : componentes) {
                if (componente instanceof JLabel) {
                    JLabel imagen1 = (JLabel) componente;
                    if (imagen1.getText().equals("")) {
                        Image img = ObtenerImagen(imagen1.getIcon().toString().replaceAll(getClass().getResource("/Imagenes/").toString().replace("/Imagenes/", ""), ""), imagen1.getWidth(), imagen1.getHeight());
                        ImageIcon icon = new ImageIcon(img);
                        imagen1.setIcon(icon);
                    }
                }
            }
        } catch (Exception ex) {
            Bitacora("Utils", "AjusteImagenes()", ex, NivelBitacora.Error);
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para la generación de Bitácoras">
    public static void Bitacora(String clase, String metodo, Exception Ex, NivelBitacora nivel) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        File archivo = new File("C:\\OmarDengo");
        File file = new File("C:\\OmarDengo\\" + "Bitácora" + Fecha(FormatoFecha.secuencia) + ".txt");
        if (!archivo.exists()) {
            archivo.mkdir();
        }
        if (!file.exists()) {
            try {
                if (!file.createNewFile()) {
                    JOptionPane.showMessageDialog(null, "Problemas generando el archivo de la bitácora.", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "Problema no controlado al generar la bitácora.\nDescripcion:\n" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF8"));
            out.write("Fecha: [ " + Fecha(FormatoFecha.ddmmyy) + " ]    Hora: [ " + Hora() + " ]    Clase: [ " + clase + " ]    Método: [ " + metodo + " ]    Error: [ " + Ex.getMessage() + " ]");
            out.newLine();
            out.close();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Problema no controlado al generar la bitácora.\nDescripcion:\n" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Crear los directorios necesarios">
    private static void CrearDirectorios() {
        try {
            File archivo = new File("C:\\Biblioteca");
            if (!archivo.exists()) {
                archivo.mkdir();
            }
        } catch (Exception ex) {
            Bitacora("Utils", "CreaDirectorios()", ex, NivelBitacora.Error);
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para inicializar los componentes necesarios para el correcto funcionamiento del sistema">
    public static void Initialize(boolean MostrarLogin) {
        try {
            System.setProperty("netbeans.buildnumber", "1.0.0.0");
            CrearDirectorios();
            rutaAplicacion = System.getProperty("user.dir");
        } catch (Exception ex) {
            Bitacora("Utils", "Initialize()", ex, NivelBitacora.Error);
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para hacer la primer letra de una palabra en mayúscula">
    public static String MayusculaPrimerLetra(String Cadena) {
        try {
            if (Cadena.length() == 0) {
                return "";
            }
            if (Cadena.length() == 1) {
                char ch = Cadena.charAt(0);
                return String.valueOf(ch).toUpperCase();
            }
            char ch2 = Cadena.charAt(0);
            return (String.valueOf(ch2).toUpperCase() + Cadena.substring(1));
        } catch (Exception ex) {
            Bitacora("Utils", "MayusculaPrimerLetra()", ex, NivelBitacora.Error);
            return "";
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método para leer achivos de texto y devolver una cadena de texto">
    public static String LeerArchivoTXT(String archivo) {
        try {
            File f = new File(archivo);
            if (!f.exists()) {
                return "";
            }
            // Abrir el archivo
            FileInputStream fstream = new FileInputStream(archivo);
            // Crear el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Crear el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
            String strLinea;
            // Leer el archivo linea por linea
            String cadena = "";
            while ((strLinea = buffer.readLine()) != null) {
                //acumular el texto
                cadena += strLinea + "\r\n";
            }
            // Cerrar el archivo
            entrada.close();
            return cadena;
        } catch (Exception ex) {
            Bitacora("Utils", "LeerArchivoTXT()", ex, NivelBitacora.Error);
            return "";
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método encargado de validar la longitud de los campos de texto">
    public static boolean ValidarTXTlength(int tamaño, JTextField txt) {
        try {
            if (txt.getText().length() >= tamaño) {
                if (txt.getSelectedText() == null || txt.getSelectedText().isEmpty()) {
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            Bitacora("Utils", "ValidarTXTlength()", ex, NivelBitacora.Error);
            return false;
        }
    }

    public static boolean ValidarTXTlength(int tamaño, JTextArea txt) {
        try {
            if (txt.getText().length() >= tamaño) {
                if (txt.getSelectedText() == null || txt.getSelectedText().isEmpty()) {
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            Bitacora("Utils", "ValidarTXTlength()", ex, NivelBitacora.Error);
            return false;
        }
    }

    public static boolean ValidarTXTlength(int tamaño, JFormattedTextField txt) {
        try {
            if (txt.getText().length() >= tamaño) {
                if (txt.getSelectedText() == null || txt.getSelectedText().isEmpty()) {
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            Bitacora("Utils", "ValidarTXTlength()", ex, NivelBitacora.Error);
            return false;
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Método encargado de generar las tablas para el JTable">
    //</editor-fold>
    //Clase de enumeraciones para las bitácoras.
    public enum NivelBitacora {

        Error,
        Debug
    }

    //Clase de enumeraciones para los formatos de las fechas.
    public enum FormatoFecha {

        ddmmyy,
        mmddyy,
        ddmmyyhh,
        mmddyyhh,
        secuencia,
        yymmdd
    }

    //Clase de enumeraciones para los formatos de las tablas.
    public enum diseñoTabla {

        dias
    }
}
